《Thinking in Java》读书笔记

对象导论

抽象过程

Java所基于语言之一Smalltalk的五个基本特性

同时也是面向对象程序的设计方式

  • 万物皆为对象

☞ 可以抽取待求解问题的任何概念化构件,使之成为对象。

  • 程序是对象的集合,它们通过发送消息来告知彼此所要做的。

☞ 可以说消息是对某个特定对象的方法的调用请求。

  • 每个对象都有自己的由其他对象所构成的存储。

☞ 可以通过创建现有对象的包的方式来创建新的对象

  • 每个对象都拥有其类型。

☞ 每个对象都是一个类的实例,而不同类的区别正在于可以接收什么样的消息。

  • 某一特定类型的所有对象都可以接收同样的消息。

☞ 可替代性。

每个对象都有一个接口

类是一种抽象数据类型,描述了具有相同特性(数据元素)和行为(功能)的对象集合,也可以说每一个对象都属于定义了特性和行为的某个类,每个类的成员或元素都具有某种共性。它的运行方式可以概括为:创建某一类型的变量(对象/实例)-> 操作变量(发送消息/请求)。

类型决定接口,而接口确定了某一特定对象所能发出的请求。

每个对象都提供服务

可以将对象视为服务提供者,提高程序的内聚性。

被隐藏的具体实现

访问控制的存在原因

  • 隐藏对数据类型的内部操作必需,而不是用户解决特定问题所需的接口的部分。
  • 允许在不影响客户端的前提下改变类内部的工作方式。

访问指定词

  • public 全部可用
  • private 类型创建者和类型的内部方法可用
  • protected 除类型创建者和类型的内部方法之外,继承的类也可以访问

复用具体实现

组合:使用现有的类合成新的类,新类的成员对象通常被声明为private。如果是动态发生的,通常称之为聚合

继承

类型不仅仅描述了作用于一个对象集合上的约束条件,同时也描述了与其他类型之间的关系。

一个基类型(基类/超类/父类)包含其所有导出类型(导出类/继承类/子类)的特性和行为。导出类复制了基类的接口,与基类具有相同的类型。从而产生了类型等价性。

使基类与导出类产生差异

  • 直接在导出类中添加新方法
  • 覆盖:在导出类中创建方法的新定义

当导出类和基类类型完全相同时(未添加新的方法)-> 纯粹替代 -> 替代方法

伴随多态的可互换对象

Java中默认执行动态绑定,也就产生了后期绑定的概念。当向对象发送消息时,被调用的代码直到运行时才能确定。

单根继承结构

所有的类最终都继承自单一的基类Object

容器

  • 不同的容器提供了不同的接口和外部行为。
  • 不同的容器对于某些操作具有不同的效率。

向上转型: 向继承结构的上层转型为一个更泛化的类型。

向下转型: 向继承结构的下层转型为一个更具体的类型。由于向下转型的危险性,从而产生了参数化类型机制

参数化类型(范型): 一个编译器可以自动制定作用于特定类型上的类,通过<类型信息>来表示,以识别对范型的使用。

对象的创建与生命期

Java采用动态内存分配方式,创建新对象时通过使用new关键字来构建对象的动态实例。并提供了“垃圾回收器”的机制,自动发现不再被使用的对象,继而销毁。

异常处理:处理错误

异常处理是与正常执行路径并行的,在发生错误时执行的另一条路径。

并发编程

线程:彼此独立运行的部分。多个线程同时工作称之为“并发”。

共享资源时,某个任务锁定某项资源,完成其任务,然后释放资源锁,使其他任务可以使用这项资源。

一切都是对象

是引用操纵对象

创建一个引用:

1
2
3
4
String s;
// 初始化引用
String s = "abcd";

此时还未与对象关联。

必须由你创建所有对象

使引用关联对象,通过new关键字来实现:

1
String s = new String("abcd");

存储区

  • 寄存器

☞ 位于处理器内部,是最快的存储区,不能直接控制。

  • 堆栈

  • 常量存储

☞ 常量值通常直接存放在代码程序内部。在嵌入式

  • 非RAM存储

☞ 把对象转化成可以存放在其他媒介上的事物,在需要时,可恢复成常规的、基于RAM的对象。如流对象和持久化对象。

永远不需要销毁对象

创建新的数据类型:类

方法,参数和返回值